var exec = require('cordova/exec'), mipush = function(){
}, native = function(name, args, success){
    //console.log('mipush native call: ' + JSON.stringify([name, args]));
    if(typeof (success) !== 'function'){
        success = function(){
        };
    }
    try{
        return exec(function(msg){
            success(null, msg);
        }, function(err){
            success(err, null);
        }, 'MiServicePlugin', name, typeof (args) === 'object' ? args : [args]);
    }catch(e){
        console.log('native error: ' + JSON.stringify(e));
    }
}, mistats = function(){
};

mistats.prototype.native = native;
mipush.prototype.native = native;

/**
 * 注册
 * @param {string} APP_ID
 * @param {string} APP_KEY
 * @param {function} func
 * @returns {mipush.prototype}
 */
mipush.prototype.registerPush = function(APP_ID, APP_KEY, func){
    this.native('registerPush', [APP_ID, APP_KEY], func);
    return this;
};

/**
 * 关闭推送
 * @returns {mipush.prototype}
 */
mipush.prototype.unregisterPush = function(){
    this.native('unregisterPush', []);
    return this;
};

/**
 * 别名
 * @param {string} alias
 * @param {function} func
 * @returns {mipush.prototype}
 */
mipush.prototype.setAlias = function(alias, func){
    this.native('setAlias', alias, func);
    return this;
};

/**
 * 取消别名
 * @param {string} alias
 * @param {function} func
 * @returns {mipush.prototype}
 */
mipush.prototype.unsetAlias = function(alias, func){
    this.native('unsetAlias', alias, func);
    return this;
};

/**
 * 订阅
 * @param {string} topic
 * @param {function} func
 * @returns {mipush.prototype}
 */
mipush.prototype.subscribe = function(topic, func){
    this.native('subscribe', topic, func);
    return this;
};

/**
 * 取消订阅
 * @param {string} topic
 * @param {function} func
 * @returns {mipush.prototype}
 */
mipush.prototype.unsubscribe = function(topic, func){
    this.native('unsubscribe', topic, func);
    return this;
};

/**
 * 设置接收MiPush服务推送的时段
 * @param {int} startHour
 * @param {int} startMin
 * @param {int} endHour
 * @param {int} endMin
 * @param {function} func
 * @returns {mipush.prototype}
 */
mipush.prototype.setAcceptTime = function(startHour, startMin, endHour, endMin, func){
    this.native('unsubscribe', [startHour, startMin, endHour, endMin], func);
    return this;
};

/**
 * 暂停接收
 * @returns {mipush.prototype}
 */
mipush.prototype.pausePush = function(){
    this.native('pausePush', []);
    return this;
};

/**
 * 恢复接收
 * @returns {mipush.prototype}
 */
mipush.prototype.resumePush = function(){
    this.native('resumePush', []);
    return this;
};
/**
 * 取客户端所有设置的别名
 * @param {function} func
 * @returns {mipush.prototype}
 */
mipush.prototype.getAllAlias = function(func){
    this.native('getAllAlias', [], func);
    return this;
};

/**
 * 获取客户端所有订阅的主题
 * @param {function} func
 * @returns {mipush.prototype}
 */
mipush.prototype.getAllTopic = function(func){
    this.native('getAllTopic', [], func);
    return this;
};

/**
 * 接收消息
 * @param {string} msg
 * @returns {undefined}
 */
mipush.prototype.onReceiveMessage = function(msg){
    console.log('onReceiveMessage: ' + msg);
};

/**
 * 服务器返回
 * @param {string} msg
 * @returns {undefined}
 */
mipush.prototype.onCommandResult = function(msg){
    console.log('onCommandResult: ' + msg);
};

// *********** 小米统计 ***************************************

/**
 * 初始化
 * @param {Object} obj
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.initialize = function(obj, func){
    this.native('miStatsInit', [obj], func);
    return this;
};

/**
 * 设置上报策略接口。
 * @param {Object} obj policy（必填）, interval（选填）
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.setUploadPolicy = function(obj, func){
    this.native('setUploadPolicy', [obj], func);
    return this;
};

/**
 * 记录界面进入事件
 * @param {String} pageName 选填
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.recordPageStart = function(pageName, func){
    this.native('recordPageStart', pageName, func);
    return this;
};

/**
 * 记录当前页面访问结束
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.recordPageEnd = function(func){
    this.native('recordPageEnd', [], func);
    return this;
};

/**
 * 记录自定义计数事件。
 * @param {Object} obj category（选填）,key（必填）
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.recordCountEvent = function(obj, func){
    this.native('recordCountEvent', [obj], func);
    return this;
};

/**
 * 记录自定义计算事件。
 * @param {Objecy} obj category（选填）,key（必填）,value（必填）
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.recordCalculateEvent = function(obj, func){
    this.native('recordCalculateEvent', [obj], func);
    return this;
};

/**
 * 记录自定义字符串属性事件。
 * @param {Objecy} obj category（选填）,key（必填）,value（必填）
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.recordStringPropertyEvent = function(obj, func){
    this.native('recordStringPropertyEvent', [obj], func);
    return this;
};

/**
 * 记录自定义数值属性事件。
 * @param {Objecy} obj category（选填）,key（必填）,value（必填）
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.recordNumericPropertyEvent = function(obj, func){
    this.native('recordNumericPropertyEvent', [obj], func);
    return this;
};

/**
 * 手动触发上报
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.triggerUploadManually = function(func){
    this.native('triggerUploadManually', [], func);
    return this;
};

/**
 * 获取设备标示
 * @param {function} func
 * @returns {mistats.prototype}
 */
mistats.prototype.getDeviceID = function(func){
    this.native('getDeviceID', [], func);
    return this;
};


module.exports = {
    native: native,
    mipush: new mipush(),
    getMiuiVersion: function(name, func){
        if(typeof (name) === 'function'){
            func = name;
            name = null;
        }
        this.native('getMiuiVersion', [name], func);
        return this;
    },
    updateAgent: function(func){
        this.native('updateAgent', [], func);
        return this;
    },
    mistats: new mistats(),
    immersive: function(mode, func){
        //mode:[trance, dark, trance|dark]
        if(typeof (mode) === 'function'){
            func = mode;
            mode = '';
        }
        this.native('immersiveMode', [mode || ''], func);
        return this;
    }
};
